home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GameStar 2004 April
/
Gamestar_61_2004-04_dvdb.iso
/
DVDStar
/
Editace
/
hltp.exe
/
{app}
/
Applications
/
QuArK
/
plugins
/
mapquake3entitylines.py
< prev
next >
Wrap
Text File
|
2004-01-05
|
10KB
|
238 lines
""" QuArK - Quake Army Knife
"""
#
# Copyright (C) 1996-99 Armin Rigo
# THIS FILE IS PROTECTED BY THE GNU GENERAL PUBLIC LICENCE
# FOUND IN FILE "COPYING.TXT"
#
#$Header: /cvsroot/quark/runtime/plugins/mapquake3entitylines.py,v 1.3 2002/12/29 12:45:17 decker_dk Exp $
Info = {
"plug-in": "Quake-3 Arrow Extensions",
"desc": "Displays axis for rotating entities and jump-archs for push-entities. Note: RED-colored jump-archs indicates that the jump isn't correctly calculated, due to either non-default gravity or too low an arch.",
"date": "2 jan 2001",
"author": "Decker",
"author e-mail": "decker@post1.tele.dk",
"quark": "Version 6.3" }
import math
from quarkpy.maputils import *
import quarkpy.mapentities
import quarkpy.qeditor
import quarkpy.qhandles
DefaultDrawEntityLines = quarkpy.mapentities.DefaultDrawEntityLines
ObjectOrigin = quarkpy.mapentities.ObjectOrigin
import plugins.deckerutils
FindOriginFlagPolyPos = plugins.deckerutils.FindOriginFlagPolyPos
class Quake3DrawEntityLines(DefaultDrawEntityLines):
# - Decker. Trying to calculate a more correct jump-arch, using the math from Q3's GameSource,
# but I simply can't figure out how to do that.
#
#def CalculateTrajectory2(self, start_vec, apex_vec, speed_angles, gravity=800.0, multiplier=2, points=16):
# path_vecs = []
# try:
# if (apex_vec is not None):
# height = apex_vec.z - start_vec.z
# if (height <= 0 or gravity <= 0):
# raise "Problem!"
# time = math.sqrt( height / ( 0.5 * gravity ) );
# if (time <= 0):
# raise "Problem!"
# direction_vec = apex_vec - start_vec
# direction_vec = quarkx.vect(direction_vec.x, direction_vec.y, 0)
# direction_vec = direction_vec.normalized
# forward = abs(direction_vec) / time
# velocity_vec = direction_vec * forward
# velocity_vec = quarkx.vect(velocity_vec.x, velocity_vec.y, time * gravity)
# else:
# speed_z, angles = speed_angles
# direction_vec = quarkpy.qhandles.angles2vec(angles)
# direction_vec = quarkx.vect(direction_vec.x, direction_vec.y, 0)
# direction_vec = direction_vec.normalized
# velocity_vec = direction_vec * speed_z
# velocity_vec = quarkx.vect(velocity_vec.x, velocity_vec.y, speed_z)
# print "direction:", direction_vec, "velocity:", velocity_vec
# except:
# print "Exception:"
# return path_vecs, color
def CalculateTrajectory(self, start_vec, apex_vec, speed_angles, gravity=800.0, multiplier=2, points=16):
# Credits to "http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/bobtoolz/bobtoolz/DBobView.cpp"
path_vecs = []
color = 0x000000
etext = None
try:
dist_vec = None
speed_z = 0
if (apex_vec is not None):
# Calculate a distance-vector between the start-vector and the apex-vector
dist_vec = apex_vec - start_vec
# If the distance-vector's z-axis is zero or negative, then we can't calculate a proper flight-arch
if (dist_vec.z <= 0):
etext = "Can't calculate with zero/negative z-distance"
raise etext
# Calculate the z-axis speed at normal gravity (800.0)
speed_z = math.sqrt(2 * gravity * dist_vec.z)
else:
if (gravity != 800):
# This calculation won't work with another gravity setting.
color = 0x0000FF
print "Trigger_push/Target_push: Gravity isn't 800.0, so jump-arch is not calculated correctly"
speed_z, angles = speed_angles
speed_z = math.sqrt(gravity * speed_z)
dist_vec = quarkpy.qhandles.angles2vec(angles)
if (dist_vec.z < 0.7):
# This calculation won't work with a pitch lower than ~45
color = 0x0000FF
print "Trigger_push/Target_push: pitch-angle is less than 45, so jump-arch is not calculated correctly"
dist_vec = dist_vec.normalized * speed_z
# Calculate the time it will take to make the "flight" at normal gravity (800.0)
flight_time = speed_z / gravity
# Calculate the speed-distance-vector of one unit of flight_time
speed_vec = dist_vec * (1 / flight_time)
# Adjust the z-axis of the speed-distance-vector
speed_vec = quarkx.vect(speed_vec.x, speed_vec.y, speed_z)
# Determine the flighttime-interval between each point
interval = (multiplier * flight_time) / points
# Calculate each point in the flight-path
for i in range(points+1):
# Compute the flighttime for this point
ltime = interval * i
# Calculate a point in the linear(straight) line from start-vector to end-vector
path_vec = speed_vec * ltime
path_vec = path_vec + start_vec
# Adjust the z-axis
z = start_vec.z + (speed_z * ltime) - (gravity * 0.5 * ltime * ltime)
path_vec = quarkx.vect(path_vec.x, path_vec.y, z)
# Put this point in the list
path_vecs.append(path_vec)
except etext:
print "exception:", etext
return path_vecs, color
def showjumparch(self, start_entity, view, entities):
apex_vec = None
speed_angles = None
if (start_entity["target"] is not None \
and start_entity["target"] != ""):
apex_entity = None
for e in entities:
if (e["targetname"] == start_entity["target"]):
apex_vec = ObjectOrigin(e)
break
else:
return
else:
speed = 1000 # Default value according to [DataQ3.QRK] target_push:form
if (start_entity["speed"] is not None \
and start_entity["speed"] != ""):
speed = int(start_entity["speed"])
angles = None
if (start_entity["angles"] is not None):
angles = start_entity["angles"]
if (angles is None):
return
speed_angles = (speed, angles)
start_vec = ObjectOrigin(start_entity)
editor = quarkpy.qeditor.mapeditor()
if editor is None:
return
worldspawn = editor.Root
gravity = 800.0
if (worldspawn["gravity"] is not None \
and worldspawn["gravity"] != ""):
gravity = int(worldspawn["gravity"])
path, color = self.CalculateTrajectory(start_vec, apex_vec, speed_angles, gravity)
if len(path) > 0:
cv = view.canvas()
cv.pencolor = color
cv.penwidth = 3
prevpath = None
for p in path:
thispath = view.proj(p)
if prevpath is not None:
cv.line(prevpath, thispath)
prevpath = thispath
def showoriginline(self, entity, xaxisbitvalue, yaxisbitvalue, view, color):
orgpos = FindOriginFlagPolyPos(entity)
if orgpos is not None:
try:
axisflags = int(entity["spawnflags"])
except:
axisflags = 0
axisdist = quarkx.vect(0, 0, 0)
if axisflags & xaxisbitvalue:
axisdist = quarkx.vect(16, 0, 0) # 16 is just some appropriate value I choosed
elif axisflags & yaxisbitvalue:
axisdist = quarkx.vect(0, 16, 0)
else:
axisdist = quarkx.vect(0, 0, 16)
cv = view.canvas()
cv.pencolor = color
cv.penwidth = 3 # So it the axis gets more visual
pos1, pos2 = (orgpos + axisdist), (orgpos - axisdist)
vpos1, vpos2 = view.proj(pos1), view.proj(pos2)
cv.line(vpos1, vpos2)
def drawentitylines(self, entity, org, view, entities, processentities):
# Draw the default target/targetname/killtarget/light/_light arrows/ellipse
DefaultDrawEntityLines.drawentitylines(self, entity, org, view, entities, processentities)
# From here its Quake-3 special
axiscolor = quarkpy.qeditor.MapColor("Axis")
rotcolor = 0xff00ff # (magenta) rotation axis
org1 = view.proj(org)
if org1.visible:
if entity.name == "func_rotating:b":
self.showoriginline(entity, 1, 2, view, rotcolor) # func_rotating has different bitvalues for X-axis and Y-axis
elif entity.name == "func_pendulum:b":
self.showoriginline(entity, 0, 0, view, rotcolor)
elif entity.name == "trigger_push:b":
self.showjumparch(entity, view, entities)
elif entity.name == "target_push:e":
self.showjumparch(entity, view, entities)
#
# Register this class with its gamename
#
quarkpy.mapentities.EntityLinesMapping.update({
"Quake 3": Quake3DrawEntityLines()
})
# ----------- REVISION HISTORY ------------
#
# $Log: mapquake3entitylines.py,v $
# Revision 1.3 2002/12/29 12:45:17 decker_dk
# A description in the plugin-infoarea, about what the black/red colors of the jump-archs mean.
#
# Revision 1.2 2002/12/28 14:03:54 decker_dk
# Added some jump-arch kindof entity-lines for 'trigger_push' and 'target_push'. Some of the math ain't correct.
#
# Revision 1.1 2001/01/30 19:20:30 decker_dk
# Basically a copy of mapquake2entitylines.py
#
#